//
//  LZTUserAccountViewModel.swift
//  LZTWeibo
//
//  Created by Yin jianxun on 16/8/12.
//  Copyright © 2016年 YinJianxun. All rights reserved.
//

import UIKit

class LZTUserAccountViewModel: NSObject {
    
    //全局访问点 单例，用于网络请求的发起
    static let sharedTools:LZTUserAccountViewModel = LZTUserAccountViewModel()
    
    //来一个 userAccount的对象，全局都利用这一个对象，对沙盒只有这一次操作，减缓内存多次读取沙盒
    var userAccount: LZTUserAccountModel?
    
    //保存归档路径
    let filePath = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString ).stringByAppendingPathComponent("userAccount.archiver")
    
    //access_token
    var accessToken: String? {
        
        //登录状态
        if userAccount?.access_token != nil {
            
            //accessTokens是否过期
            if userAccount?.expires_Date?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
                
                return userAccount?.access_token
            } else {
                return nil
            }
            
        } else {
            //用户没有登录过
            return nil
        }
        
    }
    // 判断用户是否登录
    var isLogin: Bool {
        
        return accessToken != nil
    }
    
    override init() {
        
        //类先 实例化 完成
        super.init()
        //完成后，给当前类对象的属性进行赋值
        userAccount = getUserAccount()
        
    }
}

//保存数据
extension LZTUserAccountViewModel {
    
    //保存对象
    func saveUserAccount(userAccount: LZTUserAccountModel) {
        
        //确保 第一次登录时，init（）执行时，沙盒并没有数据，因此，在保存数据时，将该属性指需要保存的对象
        self.userAccount = userAccount
        
        NSKeyedArchiver.archiveRootObject(userAccount, toFile: filePath)
        
    }
    
    //获取对象
    //获取有可能失败，失败的时候返回nil
    func getUserAccount() -> LZTUserAccountModel? {

        let result = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as? LZTUserAccountModel
        
        return result
        
    }
}

extension LZTUserAccountViewModel {
    
    func getUserAccount(code: String, finish:(isSuccess: Bool)->()) {
        
        //直接利用 networkTools封装类给的接口
        LZTNetworkTools.sharedTools.oauthLoadUserAccount(code, success: { (response) in
            
            //判断response 是否为nil 并且是否可以转成一个字典
            guard let res = response as? [String: AnyObject] else {
                finish(isSuccess: false)
                return
            }
            //返回的是字典，转模型
            let userAccount = LZTUserAccountModel(dict: res)
            
            //闭包里，self引用方法
            self.getUserInfo(userAccount, finish: finish)
            
        }) { (error) in
            print("请求获取授权-失败：\(error)")
            finish(isSuccess: false)
        }
    }
    
    //请求个人信息
    func getUserInfo(userAccount: LZTUserAccountModel, finish:(isSuccess: Bool)->()) {
        
        //直接利用 networkTools封装类给的接口
        LZTNetworkTools.sharedTools.oauthLoadUserInfo(userAccount, success: { (response) in
            
            //由于复用的model类，只是添加的属性，然而走到这个处理时，前边的处理已经通过KVC将其他三个值赋值完毕，
            //因此，只能在这直接赋值
            //如果返回结果是nil或者不能转成为一个字典
            guard let res = response as? [String: AnyObject] else {
                finish(isSuccess: false)
                return
            }
            
            //赋值
            userAccount.screen_name = res["screen_name"] as? String
            userAccount.avatar_large = res["avatar_large"] as? String
            
            print(userAccount)
            
            //保存对象
            self.saveUserAccount(userAccount)
            
            //关闭
            finish(isSuccess: true)
            
        }) { (error) in
            print("请求个人信息-失败：\(error)")
            finish(isSuccess: false)
        }
    }
    
}
